package com.google.code.gronono.commons.swing;

import java.awt.Dimension;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.MessageFormat;

import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import com.google.code.gronono.commons.i18n.BundleKey;
import com.google.code.gronono.commons.i18n.BundleName;

/**
 * Gestionnaire d'exceptions non catchées.
 */
@BundleName(value = "com.google.code.gronono.commons.swing")
public class JOptionPaneExceptionHandler implements UncaughtExceptionHandler {
	/** Largeur de la boîte de dialogue d'erreur. */
	@BundleKey(value = "exception.dialog.width")
	private static int ERR_WIDTH;
	/** Hauteur de la boîte de dialogue d'erreur. */
	@BundleKey(value = "exception.dialog.height")
	private static int ERR_HEIGHT;
	/** Titre de la boîte de dialogue d'erreur. */
	@BundleKey(value = "exception.dialog.err.title")
	private static String ERR_TITLE;
	/** Message de la boîte de dialogue d'erreur. */
	@BundleKey(value = "exception.dialog.err.msg")
	private static String ERR_MSG;
	/** Message de la boîte de dialogue d'erreur. */
	@BundleKey(value = "exception.dialog.err.msg2")
	private static String ERR_MSG2;
	/** Bouton de la boîte de dialogue d'erreur. */
	@BundleKey(value = "exception.dialog.btn")
	private static String ERR_BTN;

	/* (non-Javadoc)
	 * @see java.lang.Thread$UncaughtExceptionHandler#uncaughtException(java.lang.Thread, java.lang.Throwable)
	 */
	public void uncaughtException(final Thread t, final Throwable e) {
		// On affiche la stackTrace dans la console
		e.printStackTrace();
		
		// On récupère le StackTrace dans une String
		final StringWriter stackWriter = new StringWriter();
		e.printStackTrace(new PrintWriter(stackWriter));

		// On crée un JTextArea qui contient le stacktrace
		final JTextArea stackTrace = new JTextArea(stackWriter.toString());
		stackTrace.setEditable(false);
		// Que l'on met dans un JScrollPane
		final JScrollPane scrollStackTrace = new JScrollPane(stackTrace, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		scrollStackTrace.setPreferredSize(new Dimension(ERR_WIDTH,ERR_HEIGHT));

	    // On crée le contenu du JOptionPane (message + scrollpane)
		final Object[] message = new Object[] { MessageFormat.format(ERR_MSG, t.getName()), ERR_MSG2, " ", scrollStackTrace };

		// Et on affiche le tout dans une boite de dialogue
		JOptionPane.showOptionDialog(null, message, ERR_TITLE, 0, JOptionPane.ERROR_MESSAGE, null, new Object[] { ERR_BTN }, null);

		// Puis on ferme le programme
		System.exit(1);
	}
}
